iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Software Development

燃燒大三的成果發表系列 第 7

燃燒大三的成果發表第七天 - 屬性(Attributes)

  • 分享至 

  • xImage
  •  

昨天分享Method,今天我要來分享屬性(Attributes)的概念,然後把Method & Attribute做結合,但是屬性除了Attributes還有另一種屬性的概念稱作Property,但是本篇會以分享Attributes為主。

簡單說明一下Property,Property其實概念Attributes很像,從前天我們範例的程式碼可以發現,我們在設定Attributes的時候只是單純給值,但是Property他是比較特別的,怎麼說呢?因為Property他是寫成一個類別,底下不但有提供讀取(get)甚至還有修改(set)與刪除(delete)的method,這些method可以針對設定的屬性做更詳細的動作。

接著開始我們今天的主題

屬性(Attributes)

什麼是屬性?屬性他有點像是一個人的特色,一個人身上擁有的長相、工具、行為,屬性有分成三種權限:

  • public:每個人都能夠使用
  • protected:只有自己類別與子類別能夠使用
  • private:只有自己類別能夠使用

又有分成底下兩種分類:

  • 實例屬性(Instance Attribute)
  • 類別屬性(Class Attribute)

實例屬性(Instance Attribute)

從名稱上面我們就可以大概猜到「Instance Attribute」跟「Instance」的關係,就像是昨日的「Instance Method」一樣,實例屬性也是基於Instance,也就是實例(Instance) 的屬性(Attribute)。

了解概念之後,讓我們馬上來看範例:

class Person(object):
    
    def __init__(self, name, height, weight, age):
        self.name = name     #Instance Attribute
        self.height = height #Instance Attribute
        self.weight = weight #Instance Attribute
        self.age = age       #Instance Attribute
    
    def introduce_myself(self):
        print("Hi, I am {name} {height}cm {weight}kg {age} years old".format(name=self.name, height=self.height, weight=self.weight, age=self.age))

if __name__ == '__main__':
    Jacky = Person("Jacky", 180, 70, 18)
    Sandy = Person("Sandy", 160, 50, 18)
    Jacky.introduce_myself() #Hi, I am Jacky 180cm 70kg 18 years old
    Sandy.introduce_myself() #Hi, I am Sandy 160cm 50kg 18 years old

這段範例其實就是前兩日在分享object與Instance時,使用的範例程式碼,其實這段程式碼就有使用到實例屬性的概念,前兩日只是為了讓大家先了解何謂Instance,因此沒有多加說明。

我們在建立Instance,self是接收Instance作為參數,然後會經過__init__,而在裡面這些「self.屬性」的就稱作實例屬性。

類別屬性(Class Attribute)

類別屬性與實例屬性概念也是很相似,實例屬性是基於Instance,類別屬性則就是基於Class,讓我們直接來看看範例程式碼:

class Person(object):

    last_name = "Lin" #Class Attribute

    @classmethod
    def jacky_introduce_myself(cls):
        print("Hi, I am Jacky {last_name} ".format(last_name=cls.last_name)) # Hi, I am Jacky Lin
        cls.sandy_introduce_myself()
    
    @classmethod
    def sandy_introduce_myself(cls):
        print("Hi, I am Sandy {last_name} ".format(last_name=cls.last_name)) # Hi, I am Sandy Lin

if __name__ == '__main__':
    Person.jacky_introduce_myself()

一樣的我們在15行呼叫這個方法的時候,cls是接收Person這個類別作為參數,而在類別底下的屬性(第3行),就稱作類別屬性,能夠透過「cls.屬性」來使用。

總結

最後我們將三種方法以及兩種屬性做一個簡單的範例:

class Person(object):

    last_name = "Lin" #Class Attribute
    
    def __init__(self, name, height, weight, age): #建構子
        self.name = name     #Instance Attribute
        self.height = height #Instance Attribute
        self.weight = weight #Instance Attribute
        self.age = age       #Instance Attribute
    
    def introduce_myself(self): #Instance Method
        tool = Person.tool()
        print("自我介紹用{tool} 説: 我叫 {name}-{last_name} 身高{height}cm 體重{weight}kg 年齡{age} years old".format(tool=tool, name=self.name, last_name=self.last_name, height=self.height, weight=self.weight, age=self.age))

    @staticmethod
    def tool():
        return "麥克風"
    
if __name__ == '__main__':
    Jacky = Person("Jacky", 180, 70, 18)
    Sandy = Person("Sandy", 160, 50, 18)
    Jacky.introduce_myself() #自我介紹用麥克風 説: 我叫 Jacky-Lin 身高180cm 體重70kg 年齡18 years old
    Sandy.introduce_myself() #自我介紹用麥克風 説: 我叫 Sandy-Lin 身高160cm 體重50kg 年齡18 years old

每個小觀念結合做使用就會有一點點小複雜,這邊要特別提到一點是,因為Instance Method也是基於Class底下的實例,所以一樣能夠取得類別屬性。

實例方法(Instance Method) 類別方法(Class Method) 靜態方法(Static Method)
呼叫方式 Instance Class Class
傳入參數 self cls
使用時機 需要用到其他Instance的方法&屬性時 需要用到類別底下的物件,卻不需要實例時 不需要用到其他任何物件的方法&屬性時
能夠使用的屬性 Instance Attribute & Class Attribute Class Attribute

明天我要來分享的是物件導向特性-封裝。


上一篇
燃燒大三的成果發表第六天 - 方法(Method)
下一篇
燃燒大三的成果發表第八天 - 繼承、多型、抽象
系列文
燃燒大三的成果發表30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言